package linked;

import linked.base.ListNode;

public class Solution_19 {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int len=0;
        ListNode cur=head;
        while (cur!=null){
            cur=cur.next;
            len++;
        }
        ListNode fir=new ListNode(0,head);
        int index=len-n;
        ListNode tmp=fir;
        for (int i = 0; i < index; i++) {
            tmp=tmp.next;
        }
        tmp.next=tmp.next.next;
        return fir.next;
    }

    // ... existing code ...
    public static void main(String[] args) {
        Solution_19 solution19 = new Solution_19();

        // 测试用例1: 正常情况 - 删除中间节点
        // 链表: 1->2->3->4->5, n=2, 删除倒数第2个节点(4)
        ListNode head1 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
        ListNode result1 = solution19.removeNthFromEnd(head1, 2);
        System.out.println("测试用例1 - 删除倒数第2个节点:");
        printList(result1); // 预期输出: 1->2->3->5

        // 测试用例2: 删除头节点 - 只有一个节点
        // 链表: 1, n=1, 删除倒数第1个节点(1)
        ListNode head2 = new ListNode(1);
        ListNode result2 = solution19.removeNthFromEnd(head2, 1);
        System.out.println("测试用例2 - 删除唯一节点:");
        printList(result2); // 预期输出: null(空链表)

        // 测试用例3: 删除尾节点
        // 链表: 1->2, n=1, 删除倒数第1个节点(2)
        ListNode head3 = new ListNode(1, new ListNode(2));
        ListNode result3 = solution19.removeNthFromEnd(head3, 1);
        System.out.println("测试用例3 - 删除尾节点:");
        printList(result3); // 预期输出: 1

        // 测试用例4: 删除头节点(多个节点)
        // 链表: 1->2->3, n=3, 删除倒数第3个节点(1)
        ListNode head4 = new ListNode(1, new ListNode(2, new ListNode(3)));
        ListNode result4 = solution19.removeNthFromEnd(head4, 3);
        System.out.println("测试用例4 - 删除头节点:");
        printList(result4); // 预期输出: 2->3

        // 测试用例5: 两个节点，删除倒数第二个
        // 链表: 1->2, n=2, 删除倒数第2个节点(1)
        ListNode head5 = new ListNode(1, new ListNode(2));
        ListNode result5 = solution19.removeNthFromEnd(head5, 2);
        System.out.println("测试用例5 - 两节点删除第一个:");
        printList(result5); // 预期输出: 2
    }

    // 辅助方法：打印链表
    public static void printList(ListNode head) {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.val);
            if (current.next != null) {
                System.out.print("->");
            }
            current = current.next;
        }
        System.out.println();
    }
// ... existing code ...

}
